package utils

import (
	"encoding/json"
	"os"
	zinterface "zinx/zInterface"
)

/*
	本文件用于存储有关Zinx框架的全局参数，供其他模块使用
	一些参数是可以通过zinx.json由用户进行配置的
*/

/*
	定义一个全局的对外的GlobalObj，供其他模块使用
*/
var GlobalObject *GlobalObj

// 全局参数
type GlobalObj struct{
	/*
		服务器
	*/
	TcpServer zinterface.IServer //当前zinx全局的Server对象
	Host      string             //当前服务器主机监听的IP
	TcpPort      int                //当前服务器主机监听的端口
	Name      string             //当前服务器的名称

	/*
		Zinx
	*/
	Version          string        //当前zinx的版本号
	MaxConn          int           //当前服务器主机允许的最大连接数
	MaxPackageSize   uint32        //当前zinx框架数据包的最大值
	WorkerPoolSize   uint32        //当前业务工作池中worker的数量(一个worker对应一个goroutine)
	MaxWorkerTaskLen uint32        //zinx框架允许的最大worker数量
}

/* 
	提供一个init方法，初始化全局变量GlobalObject
	这个init方法，当用户导utils包时会自动运行
*/
func init(){
	//我们这里配置的是默认值，当用户进行配置的时候会修改为用户配置的值
	GlobalObject = &GlobalObj{
		Name:"ZinxServerApp",  //默认名
		Version: "v0.9", //默认版本号
		TcpPort: 8999, //默认端口号
		// 这里可以写127.0.0.1，但是127这个只能支持本地有回路网卡的机子才行
		Host: "0.0.0.0", //表示本地的全IP
		MaxConn: 2,
		//每一个消息包裹的最大值
		MaxPackageSize: 512,
		WorkerPoolSize:10,
		//每个worker对应的消息队列的最大任务数量(容量)
		MaxWorkerTaskLen:1024,
	}

	//应该尝试从conf/zinx.json中去加载用户自定义的参数
	// GlobalObject.Reload()
}

/* 
	从zinx.json中去加载用户自定义的参数
*/
func (g *GlobalObj)Reload(){
	data,err := os.ReadFile("conf/zinx.json")
	if err != nil{
		panic(err)
	}
	//将json文件数据解析到全局变量GlobalObject中
	err = json.Unmarshal(data,GlobalObject)
	if err != nil{
		panic(err)
	}
}